import { defineStore } from 'pinia'
import { ref, computed } from 'vue'

export const useUserStore = defineStore('user', () => {
  // 状态
  const user = ref(null)
  const token = ref(localStorage.getItem('token') || null)
  
  // 初始化时恢复用户信息
  const savedUser = localStorage.getItem('user')
  if (savedUser) {
    try {
      user.value = JSON.parse(savedUser)
    } catch (error) {
      console.error('解析用户信息失败:', error)
      localStorage.removeItem('user')
    }
  }
  
  // 计算属性
  const isLoggedIn = computed(() => !!token.value && !!user.value)
  const hasPermission = computed(() => (permission) => {
    return user.value?.permissions?.includes(permission) || false
  })
  const isAdmin = computed(() => user.value?.role_name === 'admin')
  
  // 方法
  const setUser = (userData) => {
    user.value = userData
    saveUser() // 自动保存用户信息
  }
  
  const setToken = (tokenValue) => {
    token.value = tokenValue
    if (tokenValue) {
      localStorage.setItem('token', tokenValue)
    } else {
      localStorage.removeItem('token')
    }
  }
  
  const logout = () => {
    user.value = null
    setToken(null)
    localStorage.removeItem('user')
  }
  
  const updateUser = (userData) => {
    if (user.value) {
      user.value = { ...user.value, ...userData }
      saveUser() // 自动保存更新后的用户信息
    }
  }
  
  // 保存用户信息到localStorage
  const saveUser = () => {
    if (user.value) {
      localStorage.setItem('user', JSON.stringify(user.value))
    }
  }

  // 刷新用户信息（从服务器重新获取）
  const refreshUser = async () => {
    if (!token.value) return
    
    try {
      const { authService } = await import('@/services/auth')
      const userInfo = await authService.getCurrentUser()
      setUser(userInfo)
      return userInfo
    } catch (error) {
      console.error('刷新用户信息失败:', error)
      // 如果刷新失败，可能是token过期了
      logout()
      throw error
    }
  }
  
  return {
    // 状态
    user,
    token,
    
    // 计算属性
    isLoggedIn,
    hasPermission,
    isAdmin,
    
    // 方法
    setUser,
    setToken,
    logout,
    updateUser,
    saveUser,
    refreshUser
  }
}) 